// 文件名：string_view_regex_preslice.cpp
// 目的：在日志行中提取形如 user=<name> 的用户名，采用 string_view 进行预切片，仅在正则匹配成功时复制。
// 步骤：
//   1) 使用 string_view::find 寻找标记 "user=" 的起始位置；
//   2) remove_prefix 截去此前内容，使视图指向用户名起点；
//   3) 以空格为界截取候选用户名（直到空格或行尾）；
//   4) 使用预编译的 std::regex 校验用户名格式（字母/数字/._-）；
//   5) 若匹配成功，将 candidate 复制为 std::string 返回；否则返回 nullopt。
// 性能/安全：
//   - 仅在成功路径上发生一次字符串拷贝；失败或不匹配路径上零拷贝；
//   - regex 对迭代器范围进行匹配，迭代器来自 string_view，仍指向原始 std::string 的数据，保证有效；
//   - 可替换 regex 为手写校验以降低开销（regex 较重）。
// 复杂度：O(L)（查找与匹配，与行长 L 成正比）。

#include <iostream>
#include <optional>
#include <regex>
#include <string>
#include <string_view>

std::optional<std::string> extractUser(std::string_view logLine) {
    std::string_view marker = "user=";
    std::size_t pos = logLine.find(marker);
    if (pos == std::string_view::npos) {
        return std::nullopt;
    }

    logLine.remove_prefix(pos + marker.size());
    std::size_t end = logLine.find(' ');
    std::string_view candidate = logLine.substr(0, end);

    static const std::regex userPattern(R"(^[a-zA-Z0-9._-]+$)");
    if (std::regex_match(candidate.begin(), candidate.end(), userPattern)) {
        return std::string(candidate); // 仅在匹配成功时复制
    }
    return std::nullopt;
}

int main() {
    std::string log = "ts=2025-05-14 user=jdoe action=login";
    if (auto user = extractUser(log)) {
        std::cout << "user: " << *user << '\n';
    } else {
        std::cout << "user not found or invalid\n";
    }
    return 0;
}